package com.ruoyi.bannerInfo.controller;

import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;

import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.merchant.domain.Merchant;
import com.ruoyi.merchant.service.IMerchantService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.bannerInfo.domain.BannerInfo;
import com.ruoyi.bannerInfo.service.IBannerInfoService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;

/**
 * 轮播图信息Controller
 *
 * @author ruoyi
 * @date 2025-09-15
 */
@RestController
@RequestMapping("/ruoyi/bannerInfo")
public class BannerInfoController extends BaseController
{
    @Autowired
    private IBannerInfoService bannerInfoService;

    @Autowired
    private IMerchantService merchantService;

    @Value("${miniapp.merchant-id:8}")
    private Long miniAppMerchantId;

    /**
     * 根据轮播图类型和启用状态查询轮播图列表
     * @param bannerType 轮播图类型（1=首页轮播 2=商城广告 3=酒店活动）
     * @param status 启用状态（0=启用 1=禁用）
     * @return 分页数据
     */
    @GetMapping("/listByTypeAndStatus")
    public TableDataInfo listByTypeAndStatus(String bannerType, String status) {

        // 获取当前用户所属商家ID
        Long merchantId = getMerchantIdForCurrentUser();

        // 非商家用户返回空数据
        if (merchantId == null) {
            return getDataTable(new ArrayList<>());
        }

        // 构造查询条件
        BannerInfo bannerInfo = new BannerInfo();
        bannerInfo.setMerchantId(merchantId);
        bannerInfo.setBannerType(bannerType);
        bannerInfo.setStatus(status);

        // 执行查询
        startPage();
        List<BannerInfo> list = bannerInfoService.selectBannerInfoListByTypeAndStatus(bannerInfo);
        return getDataTable(list);
    }

    /**
     * 查询轮播图信息列表
     */
//    @PreAuthorize("@ss.hasPermi('ruoyi:bannerInfo:list')")
    @GetMapping("/list")
    public TableDataInfo list(BannerInfo bannerInfo)
    {
        // 判断是否为管理员
        Long userId = getUserId();
        if (!getLoginUser().getUser().isAdmin()) {
            // 非管理员用户需要设置商家ID
            Long merchantId = getMerchantIdForCurrentUser();

            // 非商家用户返回空数据
            if (merchantId == null) {
                return getDataTable(new ArrayList<>());
            }

            // 添加商家ID查询条件
            bannerInfo.setMerchantId(merchantId);
        }

        startPage();
        List<BannerInfo> list = bannerInfoService.selectBannerInfoList(bannerInfo);
        return getDataTable(list);
    }

    /**
     * 导出轮播图信息列表
     */
//    @PreAuthorize("@ss.hasPermi('ruoyi:bannerInfo:export')")
    @Log(title = "轮播图信息", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, BannerInfo bannerInfo)
    {
        // 判断是否为管理员
        Long userId = getUserId();
        if (!getLoginUser().getUser().isAdmin()) {
            // 非管理员用户需要设置商家ID
            Long merchantId = getMerchantIdForCurrentUser();

            // 非商家用户返回空数据
            if (merchantId == null) {
                // 导出空数据
                ExcelUtil<BannerInfo> util = new ExcelUtil<BannerInfo>(BannerInfo.class);
                util.exportExcel(response, new ArrayList<>(), "轮播图信息数据");
                return;
            }

            // 添加商家ID查询条件
            bannerInfo.setMerchantId(merchantId);
        }

        List<BannerInfo> list = bannerInfoService.selectBannerInfoList(bannerInfo);
        ExcelUtil<BannerInfo> util = new ExcelUtil<BannerInfo>(BannerInfo.class);
        util.exportExcel(response, list, "轮播图信息数据");
    }

    /**
     * 获取轮播图信息详细信息
     */
//    @PreAuthorize("@ss.hasPermi('ruoyi:bannerInfo:query')")
    @GetMapping(value = "/{bannerId}")
    public AjaxResult getInfo(@PathVariable("bannerId") Long bannerId)
    {
        BannerInfo bannerInfo = bannerInfoService.selectBannerInfoByBannerId(bannerId);

        // 判断是否为管理员
        if (!getLoginUser().getUser().isAdmin()) {
            // 验证商家权限
            Long merchantId = getMerchantIdForCurrentUser();
            if (merchantId != null && !merchantId.equals(bannerInfo.getMerchantId())) {
                return AjaxResult.error("无权访问该数据");
            }
        }

        return success(bannerInfo);
    }

    /**
     * 新增轮播图信息
     */
//    @PreAuthorize("@ss.hasPermi('ruoyi:bannerInfo:add')")
    @Log(title = "轮播图信息", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody BannerInfo bannerInfo)
    {
        // 判断是否为管理员
        if (!getLoginUser().getUser().isAdmin()) {
            // 自动设置商家ID
            Long merchantId = getMerchantIdForCurrentUser();
            if (merchantId == null) {
                return AjaxResult.error("当前用户无权添加轮播图信息");
            }
            bannerInfo.setMerchantId(merchantId);
        }
        return toAjax(bannerInfoService.insertBannerInfo(bannerInfo));
    }

    /**
     * 修改轮播图信息
     */
//    @PreAuthorize("@ss.hasPermi('ruoyi:bannerInfo:edit')")
    @Log(title = "轮播图信息", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody BannerInfo bannerInfo)
    {
        // 判断是否为管理员
        if (!getLoginUser().getUser().isAdmin()) {
            // 验证商家权限
            Long merchantId = getMerchantIdForCurrentUser();
            if (merchantId != null && !merchantId.equals(bannerInfo.getMerchantId())) {
                return AjaxResult.error("无权修改该数据");
            }
        }
        return toAjax(bannerInfoService.updateBannerInfo(bannerInfo));
    }

    /**
     * 删除轮播图信息
     */
//    @PreAuthorize("@ss.hasPermi('ruoyi:bannerInfo:remove')")
    @Log(title = "轮播图信息", businessType = BusinessType.DELETE)
    @DeleteMapping("/{bannerIds}")
    public AjaxResult remove(@PathVariable Long[] bannerIds)
    {
        // 判断是否为管理员
        if (!getLoginUser().getUser().isAdmin()) {
            // 验证商家权限
            Long merchantId = getMerchantIdForCurrentUser();
            if (merchantId == null) {
                return AjaxResult.error("当前用户无权删除轮播图信息");
            }

            // 检查要删除的数据是否属于当前商家
            for (Long bannerId : bannerIds) {
                BannerInfo bannerInfo = bannerInfoService.selectBannerInfoByBannerId(bannerId);
                if (!merchantId.equals(bannerInfo.getMerchantId())) {
                    return AjaxResult.error("无权删除不属于当前商家的数据");
                }
            }
        }

        return toAjax(bannerInfoService.deleteBannerInfoByBannerIds(bannerIds));
    }

    /**
     * 小程序端获取轮播图列表（公开接口，不需要登录）
     * 根据轮播图类型和启用状态查询轮播图列表
     * @param bannerType 轮播图类型（1=首页轮播 2=商城广告 3=酒店活动）
     * @param status 启用状态（0=启用 1=禁用）
     * @return 轮播图列表
     */
    @GetMapping("/miniapp/listByTypeAndStatus")
    public AjaxResult miniappListByTypeAndStatus(String bannerType, String status) {
        // 小程序端使用固定的商家ID
        Long merchantId = getMiniAppMerchantId();

        if (merchantId == null) {
            return AjaxResult.error("未配置小程序商家ID");
        }

        // 构造查询条件
        BannerInfo bannerInfo = new BannerInfo();
        bannerInfo.setMerchantId(merchantId);
        bannerInfo.setBannerType(bannerType);
        bannerInfo.setStatus(status);

        // 执行查询
        List<BannerInfo> list = bannerInfoService.selectBannerInfoListByTypeAndStatus(bannerInfo);
        return AjaxResult.success(list);
    }

    /**
     * 获取小程序端的商家ID
     * @return 商家ID
     */
    private Long getMiniAppMerchantId() {
        // 从配置文件中读取小程序商家ID
        return miniAppMerchantId;
    }

    /**
     * 获取当前用户所属商家ID
     * 管理端：返回当前登录管理员所属的商家ID
     * 小程序端：返回小程序绑定的商家ID
     * @return 商家ID
     */
    private Long getMerchantIdForCurrentUser() {
        // 获取当前用户ID
        Long userId = getUserId();

        // 管理员用户特殊处理
        if (SecurityUtils.isAdmin(userId)) {
            // 管理员可以看到所有数据，但在新增/修改时需要指定商家ID
            // 这里返回null，让调用方决定是否需要特殊处理
            return null;
        }

        // 普通用户：根据用户ID查询所属商家
        Merchant merchantInfo = merchantService.selectMerchantByUserId(userId);
        return merchantInfo != null ? merchantInfo.getMerchantId() : null;
    }
}
